package com.mofang.ticketing.user.serve.account.service;

import com.mofang.ticketing.common.core.enums.account.AccountTypeEnum;
import com.mofang.ticketing.common.core.enums.account.BelongEnum;
import com.mofang.ticketing.common.security.bo.UserDetailBO;
import com.mofang.ticketing.user.client.pojo.response.AuthUserBelongMerchantRespDTO;
import com.mofang.ticketing.user.mapping.entity.SysUserDO;
import com.mofang.ticketing.user.serve.account.bo.Permission;
import com.mofang.ticketing.user.serve.account.dto.request.AccountLoginReqDTO;
import com.mofang.ticketing.user.serve.account.dto.request.AppendPermissionReqDTO;
import com.mofang.ticketing.user.serve.account.dto.request.InitPlatformAdminAccountReqDTO;
import com.mofang.ticketing.user.serve.account.dto.response.AccountLoinRespDTO;
import com.mofang.ticketing.user.serve.account.dto.response.CurrentAccountInfoRespDTO;

import java.util.List;

/**
 * 认证服务
 *
 * @author LGC
 */
public interface AuthService {

    /**
     * 初始化权限
     *
     * @return
     */
    void initializePermission();

    /**
     * 追加没有添加过的权限
     *
     * @param dto
     * @return
     */
    List<Permission> appendPermission(AppendPermissionReqDTO dto);

    /**
     * 初始化系统管理员
     */
    SysUserDO initPlatformAdminAccount(InitPlatformAdminAccountReqDTO dto);


    /**
     * 初始化商户管理员账号
     *
     * @param username   用户名
     * @param account    账号
     * @param merchantId 商户ID
     * @param userId     操作人
     * @return
     */
    SysUserDO initMerchantAdminAccount(String username, String account, Long merchantId, Long userId);

    /**
     * 登录功能
     *
     * @param dto
     * @return 生成的JWT的token
     */
    AccountLoinRespDTO login(AccountLoginReqDTO dto);

    /**
     * 退出登录
     */
    void logout();


    /**
     * 当前账号登录信息
     *
     * @return 当前账号登录信息
     */
    CurrentAccountInfoRespDTO currentAccountInfo();

    /**
     * 根据账号获取用户认证信息
     *
     * @param account 账号
     * @param belong  所属组织
     * @return
     */
    UserDetailBO getAuthInfo(String account, Integer belong);

    /**
     * 获取认证用户所属商户
     *
     * @return
     */
    List<AuthUserBelongMerchantRespDTO> authBelongMerchants();

    /**
     * 获取认证用户所属商户ID
     */
    List<Long> authBelongMerchantIds();

    /**
     * 更新账号密码
     *
     * @param sysUserDO
     * @param confirmPwd
     * @return
     */
    boolean updateAccountPwd(SysUserDO sysUserDO, String confirmPwd);

    /**
     * 更新账号（手机号）
     *
     * @param sysUserDO
     * @param newPhone
     * @return
     */
    boolean updateAccount(SysUserDO sysUserDO, String newPhone);

    /**
     * 更新用户名
     *
     * @param username
     * @param sysUserDO
     */
    boolean updateUsername(String username, SysUserDO sysUserDO);

    /**
     * 账号禁用启用
     *
     * @param sysUserDO
     * @return
     */
    boolean accountEnable(SysUserDO sysUserDO);

    /**
     * 插入用户
     *
     * @param belongEnum
     * @param accountTypeEnum
     * @param username
     * @param account
     * @param userId          操作用户ID
     * @return
     */
    SysUserDO insertAccount(BelongEnum belongEnum, AccountTypeEnum accountTypeEnum, String username, String account, Long userId);

}
